package DAO;

import AccesoBD.AccesoBaseDatos;
import Dominio.AsignaturaOptativa;
import Dominio.Carrera;
import Dominio.ProgramaEducativo;
import Dominio.ReticulaAcademica;
import Dominio.Semestre;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.logging.Level;
import java.util.logging.Logger;

public class DAOProgramaEducativo {
    public static final String TABLA_PROGRAMAS_EDUCATIVOS = "programas_educativos";
    public static final String COLUMNA_NOMBRE = "nombre";
    public static final String COLUMNA_CVE_CARRERA = "clave_carrera";
    public static final String COLUMNA_CVE_RETICULA = "clave_ret_acad";
    public static final String COLUMNA_CVE_PROGRAMA = "clave_programa_educativo";
    private DAOAsignaturaOptativa daoAsignaturaOptativa;
    private DAOReticulaAcademica daoReticula;
    private AccesoBaseDatos acceso = new AccesoBaseDatos();
    private Connection conexion = null;
    
    public DAOProgramaEducativo(){
        this.conexion = this.acceso.abrirConexion();
        this.daoAsignaturaOptativa = new DAOAsignaturaOptativa();
        this.daoReticula = new DAOReticulaAcademica();
    }
    
    public boolean registrarProgramaEducativo(ProgramaEducativo programa){
        boolean ok = true;
        try{
            ReticulaAcademica reticula;
            ProgramaEducativo p;
            ArrayList<AsignaturaOptativa> optativas = programa.getReticula().getAsignaturasOptativas();
            Carrera carrera = programa.getCarrera();
            reticula = daoReticula.registrarReticulaAcademica(programa.getReticula());
            
            if(reticula != null){
                String queryRegistro = "INSERT INTO "+TABLA_PROGRAMAS_EDUCATIVOS+" ("
                        +COLUMNA_NOMBRE+","+ COLUMNA_CVE_CARRERA+","+COLUMNA_CVE_RETICULA+") VALUES('"
                        +programa.getNombre().toUpperCase()+"','"+carrera.getClaveCarrera()+"','"+reticula.getClave_ret_acad()+ "')";
                PreparedStatement sentencia = this.conexion.prepareStatement(queryRegistro,Statement.RETURN_GENERATED_KEYS);
                int afectados = sentencia.executeUpdate();
                if(afectados == 0){
                    ok = false;
                    throw new SQLException("Problema registrando el programa educativo.");
                }else{
                    ResultSet generado = sentencia.getGeneratedKeys();
                    if(generado.next()){
                        p = new ProgramaEducativo(programa.getNombre().toUpperCase(),generado.getInt(1),programa.getCarrera(),reticula);
                        for(int k=0;k<p.getReticula().getAsignaturasOptativas().size();k++){
                            AsignaturaOptativa o = p.getReticula().getAsignaturasOptativas().get(k);
                            //String nombreOptativa = o.getNombre();
                            o.setPrograma(p);
                        }
                        daoAsignaturaOptativa.registrarOptativas(p);
                    }else{
                        ok = false;
                        throw new SQLException();
                    }
                }
            }else{
                ok = false;
                throw new SQLException();
            }
        }catch(SQLException ex){
            System.out.println("Ocurrió un problema al intentar registrar el programa.\n");
            ex.printStackTrace();
        }
        return ok;
    }
    public void eliminarProgramaEducativo(int clavePE){
        try {
            Statement sentencia = acceso.crearSentenciaBD(conexion);
            String query = "DELETE FROM "+TABLA_PROGRAMAS_EDUCATIVOS+" WHERE "+COLUMNA_CVE_PROGRAMA +"='"+clavePE+"'";
            sentencia.executeUpdate(query);
        } catch (SQLException ex) {
            Logger.getLogger(DAOProgramaEducativo.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
    
    public ArrayList<ProgramaEducativo> listarProgramas(){
        ArrayList<ProgramaEducativo> programas = new ArrayList<ProgramaEducativo>();
        ResultSet resultado = null;
        DAOCarrera daocarrera = new DAOCarrera();
        DAOReticulaAcademica daoreticula = new DAOReticulaAcademica();        
        try {            
            Statement sentencia = acceso.crearSentenciaBD(conexion);
            String query = "SELECT * FROM "+TABLA_PROGRAMAS_EDUCATIVOS;
            resultado = sentencia.executeQuery(query);
            while(resultado.next()){
                int clave = resultado.getInt(1);
                String nombre = resultado.getObject(2).toString();
                int claveCarrera = resultado.getInt(3);
                int claveReticula = resultado.getInt(4);
                Carrera carrera = daocarrera.buscarCarrera(claveCarrera);
                ReticulaAcademica reticula = daoreticula.obtenerReticula(claveReticula);
                ProgramaEducativo programa = new ProgramaEducativo(nombre, clave, carrera, reticula);
                programas.add(programa);
            }
            return programas;
        } catch (SQLException ex) {
            Logger.getLogger(DAOProgramaEducativo.class.getName()).log(Level.SEVERE, null, ex);
        }
        return programas;
    }
    
    public ProgramaEducativo buscarPrograma(int clavePrograma){
        DAOCarrera daoCarrera = new DAOCarrera();
        try{
            Statement sentencia = acceso.crearSentenciaBD(conexion);
            String query = "SELECT * FROM "+TABLA_PROGRAMAS_EDUCATIVOS+" WHERE "+COLUMNA_CVE_PROGRAMA+"='"+clavePrograma+"';";
            ResultSet resultado = sentencia.executeQuery(query);
            ProgramaEducativo programa;
            if(resultado.next()){
                resultado.first();
                int cvePrograma = resultado.getInt(1);
                String nombre = resultado.getString(2);
                int cveCarrera = resultado.getInt(3);
                int cveReticula = resultado.getInt(4);
                ReticulaAcademica reticula = daoReticula.obtenerReticula(cveReticula);
                Carrera carrera = daoCarrera.buscarCarrera(cveCarrera);
                programa = new ProgramaEducativo(nombre, cvePrograma, carrera, reticula);
                return programa;
            }
        }catch (SQLException ex) {
            Logger.getLogger(DAOProgramaEducativo.class.getName()).log(Level.SEVERE, null, ex);
        }
        return null;
    }        
    
    public void cerrarconexionAProgramas(){
        acceso.cerrarConexion(conexion);
    }
    
    public String obtenerabreviaturaDePE(int clavePE) {
         String abreviaturaPE = "";
        
        try {                       
            String queryBusqueda = "SELECT "+COLUMNA_NOMBRE+" FROM "+TABLA_PROGRAMAS_EDUCATIVOS+" WHERE "+COLUMNA_CVE_PROGRAMA+" = '"+clavePE+"';";
                    
            Statement sentencia = acceso.crearSentenciaBD(conexion);
            ResultSet resultado = sentencia.executeQuery(queryBusqueda);
            
            while(resultado.next()){
                abreviaturaPE = resultado.getString(1);                
            }
            
        } catch (SQLException ex) {
            Logger.getLogger(DAOProgramaEducativo.class.getName()).log(Level.SEVERE, null, ex);
        }
        
        return abreviaturaPE;
    }
    
    public int obtenerClaveReticulaAcademica(String nombrePE){
        int claveRA = 0;
        try {          
            ResultSet resultado = null;
             Statement sentencia = acceso.crearSentenciaBD(conexion);
             String query = "SELECT * FROM "+TABLA_PROGRAMAS_EDUCATIVOS + " WHERE nombre = '" + nombrePE + "' ";
                resultado = sentencia.executeQuery(query);
                while(resultado.next()){
                claveRA = resultado.getInt(4);
                }
           
        } catch (SQLException ex) {
            Logger.getLogger(DAOProgramaEducativo.class.getName()).log(Level.SEVERE, null, ex);
        }
         return claveRA;
    }
    
     public int obtenerClavePE(String nombrePE){
        int clavePE = 0;
        try {          
            ResultSet resultado = null;
             Statement sentencia = acceso.crearSentenciaBD(conexion);
             String query = "SELECT * FROM "+TABLA_PROGRAMAS_EDUCATIVOS + " WHERE nombre = '" + nombrePE + "' ";
                resultado = sentencia.executeQuery(query);
                while(resultado.next()){
                clavePE = resultado.getInt(1);
                }
           
        } catch (SQLException ex) {
            Logger.getLogger(DAOProgramaEducativo.class.getName()).log(Level.SEVERE, null, ex);
        }
         return clavePE;
    }
     
     public boolean existeProgramaEducativo(String nombreDelProgramaEducativo) {
         
         boolean existe = false;
         
         try {          
            ResultSet resultado = null;
             Statement sentencia = acceso.crearSentenciaBD(conexion);
             String query = "SELECT * FROM "+TABLA_PROGRAMAS_EDUCATIVOS + " WHERE nombre = '" + nombreDelProgramaEducativo + "' ";
            resultado = sentencia.executeQuery(query);
                            
            while(resultado.next()){
                existe = true;
            }
           
        } catch (SQLException ex) {
            Logger.getLogger(DAOProgramaEducativo.class.getName()).log(Level.SEVERE, null, ex);
        }
         
         
        return existe;
     }
     
      public boolean existeProgramaEducativoParaLaCarrera(int claveCarrera) {
         
         boolean existe = false;
         
         try {          
            ResultSet resultado = null;
             Statement sentencia = acceso.crearSentenciaBD(conexion);
             String query = "SELECT * FROM "+TABLA_PROGRAMAS_EDUCATIVOS + " WHERE "+COLUMNA_CVE_CARRERA+" = '" + claveCarrera + "' ";
            resultado = sentencia.executeQuery(query);
                            
            while(resultado.next()){
                existe = true;
            }
           
        } catch (SQLException ex) {
            Logger.getLogger(DAOProgramaEducativo.class.getName()).log(Level.SEVERE, null, ex);
        }
         
         
        return existe;
     }
}
